package br.com.ff.cliente.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.ff.cliente.entidade.Cliente;
import br.com.ff.cliente.to.ClienteTO;
import br.com.ff.commons.dao.BaseDAOImpl;

public class ClienteDAOImpl extends BaseDAOImpl implements ClienteDAO {

	public ClienteDAOImpl(EntityManager entityManager) {
		super(entityManager);
	}

	@Override
	public List<Cliente> findByParams(ClienteTO clienteTO) {

		String nome = clienteTO.getNome();
		Character tipoPessoa = clienteTO.getFisicoJuridico();
		String descricao = clienteTO.getDescricao();
		int status = -1; 
		
		if (clienteTO.getStatus() != null) {
			status = clienteTO.getStatus().getStatus();
		}
		
		String queryStr = "SELECT object(c) FROM Cliente c ";
		
		if ((nome != null && !nome.equals(""))
				|| (tipoPessoa != null && tipoPessoa != null)
				|| (descricao != null && !descricao.equals(""))
				|| status > -1) {
			queryStr += "WHERE ";
		}
		
		boolean nomeFlag = false;
		if (nome != null && !nome.equals("")) {
			queryStr += " c.nome LIKE :nomeP ";
			nomeFlag = true;
		}
		
		boolean tipoPessoaFlag = false;
		if (tipoPessoa != null && tipoPessoa != null) {
			if (nomeFlag) {
				queryStr += " AND ";
			}
			queryStr += " c.fisicoJuridico = :fisicoJuridicoP ";
			tipoPessoaFlag = true;
		}
		
		boolean descricaoFlag = false;
		if (descricao != null && !descricao.equals("")) {
			if (tipoPessoaFlag) {
				queryStr += " AND ";
			}
			queryStr += " c.descricao LIKE :descricaoP ";
			descricaoFlag = true;
		}
		
		boolean statusFlag = false;
		if (status > -1) {
			if (descricaoFlag) {
				queryStr += " AND ";
			}
			queryStr += " c.status = :statusP ";
			statusFlag = true;
		}
		
		Query query = getEntityManager().createQuery(queryStr);
		
		if (nomeFlag) {
			query.setParameter("nomeP", nome+"");
		}
		if (tipoPessoaFlag) {
			query.setParameter("fisicoJuridicoP", tipoPessoa);
		}
		if (descricaoFlag) {
			query.setParameter("descricaoP", "%"+descricao+"+");
		}
		if (statusFlag) {
			query.setParameter("statusP", status);
		}
		
		return query.getResultList();
	}

}
